home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / libg_261.zip / libg_261 / libg++ / etc / benchmarks / Char.h < prev    next >
C/C++ Source or Header  |  1994-05-13  |  15KB  |  404 lines

  1. // This may look like C code, but it is really -*- C++ -*-
  2. /* 
  3. Copyright (C) 1989 Free Software Foundation
  4.     written by Doug Lea (dl@rocky.oswego.edu)
  5.  
  6. This file is part of GNU CC.
  7.  
  8. GNU CC is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY.  No author or distributor
  10. accepts responsibility to anyone for the consequences of using it
  11. or for whether it serves any particular purpose or works at all,
  12. unless he says so in writing.  Refer to the GNU CC General Public
  13. License for full details.
  14.  
  15. Everyone is granted permission to copy, modify and redistribute
  16. GNU CC, but only under the conditions described in the
  17. GNU CC General Public License.   A copy of this license is
  18. supposed to have been given to you along with GNU CC so you
  19. can know your rights and responsibilities.  It should be in a
  20. file named COPYING.  Among other things, the copyright notice
  21. and this notice must be preserved on all copies.  
  22. */
  23.  
  24. #ifndef _Char_h
  25. #define _Char_h 1
  26.  
  27. /* compile with
  28.  
  29.     -DBUILTIN  - to get standard chars
  30.     -DCALL     - to get calls instead of inlines 
  31.                  (in which case don't use -finline-functions!)
  32.     -DVIRT     - to make all members virtual
  33.     -DBYVAL    - to use call-by-value, not by-reference
  34.           (-DNO_GNU_CONST - to eliminate calling const functions const
  35.             **** REMOVED, NO LONGER SUPPORTED IN G++ *****)
  36.     -DNO_GNU_CONST - to eliminate calling const functions const
  37.     -DCONVERT  - to eliminate mixed mode fns that avoid constructors
  38.     -DNO_NRV   - to eliminate use of named return values
  39.     -DFAKEVPTR - to get one pocharer per object padding
  40.     -DRETREF   - to make =, +=, etc. return *this, not void
  41. */
  42.  
  43. #ifdef BUILTIN
  44. typedef char Char;
  45. #else
  46.  
  47. #ifdef CALL
  48. #define INLINE
  49. #else
  50. #define INLINE inline
  51. #endif
  52.  
  53. #ifndef VIRT
  54. #define VIRTUAL
  55. #else
  56. #define VIRTUAL virtual
  57. #endif
  58.  
  59. #ifdef BYVAL
  60. #define REF 
  61. #else
  62. #define REF &
  63. #endif
  64.  
  65.  
  66. #ifndef  CONVERT
  67. #define EXPLICIT
  68. #endif
  69.  
  70. #ifndef RETREF
  71. #define CharR void
  72. #define ReturnCharR 
  73. #else
  74. #define CharR Char&
  75. #define ReturnCharr  return *this
  76. #endif
  77.  
  78. class Char 
  79. {
  80. protected:
  81.   char          rep;
  82. #ifdef FAKEVPTR
  83.   void*        fake_vptr;
  84. #endif
  85. public: 
  86.                Char ();
  87.                Char (const char  b);
  88.                Char (const Char& b);
  89.   VIRTUAL      ~Char();
  90.  
  91.                operator char() const;
  92.  
  93.   VIRTUAL char   val() const;
  94.  
  95.   VIRTUAL CharR operator  = (const char);
  96.   VIRTUAL CharR operator  = (const Char&);
  97.  
  98.   VIRTUAL CharR negate();
  99.   VIRTUAL CharR complement();
  100.   VIRTUAL CharR operator ++ ();
  101.   VIRTUAL CharR operator -- ();
  102.  
  103.   VIRTUAL CharR operator += (const Char REF );
  104.   VIRTUAL CharR operator -= (const Char REF );
  105.   VIRTUAL CharR operator *= (const Char REF );
  106.   VIRTUAL CharR operator /= (const Char REF );
  107.   VIRTUAL CharR operator %= (const Char REF );
  108.   VIRTUAL CharR operator |= (const Char REF );
  109.   VIRTUAL CharR operator &= (const Char REF );
  110.   VIRTUAL CharR operator ^= (const Char REF );
  111.   VIRTUAL CharR operator <<=(const Char REF );
  112.   VIRTUAL CharR operator >>=(const Char REF );
  113.  
  114. #ifdef EXPLICIT
  115.   VIRTUAL CharR operator += (const char);
  116.   VIRTUAL CharR operator -= (const char);
  117.   VIRTUAL CharR operator *= (const char);
  118.   VIRTUAL CharR operator /= (const char);
  119.   VIRTUAL CharR operator %= (const char);
  120.   VIRTUAL CharR operator |= (const char);
  121.   VIRTUAL CharR operator &= (const char);
  122.   VIRTUAL CharR operator ^= (const char);
  123.   VIRTUAL CharR operator <<=(const char);
  124.   VIRTUAL CharR operator >>=(const char);
  125.  
  126. #endif
  127. };
  128.  
  129. INLINE char  Char::val() const { return rep; }
  130. INLINE      Char::operator char() const { return val(); }
  131.  
  132. INLINE      Char::Char () :rep(0) {}
  133. INLINE      Char::Char (const char  b) :rep(b) {}
  134. INLINE      Char::Char (const Char& b) :rep(b.Char::val()) {}
  135. INLINE      Char::~Char() {}
  136.  
  137. INLINE CharR Char::operator  = (const char  b) 
  138. { rep = b; ReturnCharR; }
  139. INLINE CharR Char::operator  = (const Char&  b) 
  140. { rep = b.Char::val(); ReturnCharR; }
  141.  
  142. INLINE CharR Char::complement()
  143. { rep = ~rep; ReturnCharR; }
  144. INLINE CharR Char::negate()
  145. { rep = -rep; ReturnCharR; }
  146. INLINE CharR Char::operator ++ ()        
  147. { ++rep; ReturnCharR; }
  148. INLINE CharR Char::operator -- ()        
  149. { --rep; ReturnCharR; }
  150.  
  151. INLINE CharR Char::operator += (const Char REF  b) 
  152. { rep += b.Char::val(); ReturnCharR; }
  153. INLINE CharR Char::operator -= (const Char REF  b) 
  154. { rep -= b.Char::val(); ReturnCharR; }
  155. INLINE CharR Char::operator *= (const Char REF  b) 
  156. { rep *= b.Char::val(); ReturnCharR; }
  157. INLINE CharR Char::operator /= (const Char REF  b) 
  158. { rep /= b.Char::val(); ReturnCharR; }
  159. INLINE CharR Char::operator %= (const Char REF  b) 
  160. { rep %= b.Char::val(); ReturnCharR; }
  161. INLINE CharR Char::operator |= (const Char REF  b) 
  162. { rep |= b.Char::val(); ReturnCharR; }
  163. INLINE CharR Char::operator &= (const Char REF  b) 
  164. { rep &= b.Char::val(); ReturnCharR; }
  165. INLINE CharR Char::operator ^= (const Char REF  b) 
  166. { rep ^= b.Char::val(); ReturnCharR; }
  167. INLINE CharR Char::operator <<=(const Char REF  b) 
  168. { rep <<= b.Char::val(); ReturnCharR; }
  169. INLINE CharR Char::operator >>=(const Char REF  b) 
  170. { rep >>= b.Char::val(); ReturnCharR; }
  171.  
  172. #ifdef EXPLICIT
  173.  
  174. INLINE CharR Char::operator += (const char b) 
  175. { rep += b; ReturnCharR; }
  176. INLINE CharR Char::operator -= (const char b) 
  177. { rep -= b; ReturnCharR; }
  178. INLINE CharR Char::operator *= (const char b) 
  179. { rep *= b; ReturnCharR; }
  180. INLINE CharR Char::operator /= (const char b) 
  181. { rep /= b; ReturnCharR; }
  182. INLINE CharR Char::operator %= (const char b) 
  183. { rep %= b; ReturnCharR; }
  184. INLINE CharR Char::operator |= (const char b) 
  185. { rep |= b; ReturnCharR; }
  186. INLINE CharR Char::operator &= (const char b) 
  187. { rep &= b; ReturnCharR; }
  188. INLINE CharR Char::operator ^= (const char b) 
  189. { rep ^= b; ReturnCharR; }
  190. INLINE CharR Char::operator <<=(const char b) 
  191. { rep <<= b; ReturnCharR; }
  192. INLINE CharR Char::operator >>=(const char b) 
  193. { rep >>= b; ReturnCharR; }
  194.  
  195.  
  196. INLINE char& operator += (char& a,  const Char REF  b) 
  197. { a += b.Char::val(); return a; }
  198. INLINE char& operator -= (char& a,  const Char REF  b) 
  199. { a -= b.Char::val(); return a;}
  200. INLINE char& operator *= (char& a,  const Char REF  b) 
  201. { a *= b.Char::val(); return a;}
  202. INLINE char& operator /= (char& a,  const Char REF  b) 
  203. { a /= b.Char::val(); return a;}
  204. INLINE char& operator %= (char& a,  const Char REF  b) 
  205. { a %= b.Char::val(); return a;}
  206. INLINE char& operator |= (char& a,  const Char REF  b) 
  207. { a |= b.Char::val(); return a;}
  208. INLINE char& operator &= (char& a,  const Char REF  b) 
  209. { a &= b.Char::val(); return a;}
  210. INLINE char& operator ^= (char& a,  const Char REF  b) 
  211. { a ^= b.Char::val(); return a;}
  212. INLINE char& operator <<=(char& a,  const Char REF  b) 
  213. { a <<= b.Char::val(); return a;}
  214. INLINE char& operator >>=(char& a,  const Char REF  b) 
  215. { a >>= b.Char::val(); return a;}
  216.  
  217. #endif
  218.  
  219. #ifdef _G_NO_NRV
  220.  
  221. INLINE Char  operator -  (const Char REF  a) 
  222. { Char r(a); r.negate(); return r; }
  223. INLINE Char  operator ~  (const Char REF  a) 
  224. { Char r(a); r.complement(); return r; }
  225.  
  226. INLINE Char  operator +  (const Char REF  a, const Char REF  b) 
  227. { Char r(a); r += b.Char::val(); return r; }
  228. INLINE Char  operator -  (const Char REF  a, const Char REF  b) 
  229. { Char r(a); r -= b.Char::val(); return r; }
  230. INLINE Char  operator *  (const Char REF  a, const Char REF  b) 
  231. { Char r(a); r *= b.Char::val(); return r; }
  232. INLINE Char  operator /  (const Char REF  a, const Char REF  b) 
  233. { Char r(a); r /= b.Char::val(); return r; }
  234. INLINE Char  operator %  (const Char REF  a, const Char REF  b) 
  235. { Char r(a); r %= b.Char::val(); return r; }
  236. INLINE Char  operator << (const Char REF  a, const Char REF  b) 
  237. { Char r(a); r <<= b.Char::val(); return r; }
  238. INLINE Char  operator >> (const Char REF  a, const Char REF  b) 
  239. { Char r(a); r >>= b.Char::val(); return r; }
  240. INLINE Char  operator &  (const Char REF  a, const Char REF  b) 
  241. { Char r(a); r &= b.Char::val(); return r; }
  242. INLINE Char  operator |  (const Char REF  a, const Char REF  b) 
  243. { Char r(a); r |= b.Char::val(); return r; }
  244. INLINE Char  operator ^  (const Char REF  a, const Char REF  b) 
  245. { Char r(a); r ^= b.Char::val(); return r; }
  246.  
  247. INLINE Char  operator +  (const Char REF  a, const char b) 
  248. { Char r(a); r += b; return r; }
  249. INLINE Char  operator -  (const Char REF  a, const char b) 
  250. { Char r(a); r -= b; return r; }
  251. INLINE Char  operator *  (const Char REF  a, const char b) 
  252. { Char r(a); r *= b; return r; }
  253. INLINE Char  operator /  (const Char REF  a, const char b) 
  254. { Char r(a); r /= b; return r; }
  255. INLINE Char  operator %  (const Char REF  a, const char b) 
  256. { Char r(a); r %= b; return r; }
  257. INLINE Char  operator << (const Char REF  a, const char b) 
  258. { Char r(a); r <<= b; return r; }
  259. INLINE Char  operator >> (const Char REF  a, const char b) 
  260. { Char r(a); r >>= b; return r; }
  261. INLINE Char  operator &  (const Char REF  a, const char b) 
  262. { Char r(a); r &= b; return r; }
  263. INLINE Char  operator |  (const Char REF  a, const char b) 
  264. { Char r(a); r |= b; return r; }
  265. INLINE Char  operator ^  (const Char REF  a, const char b) 
  266. { Char r(a); r ^= b; return r; }
  267.  
  268. INLINE Char  operator +  (const char a, const Char REF  b) 
  269. { Char r(a); r += b.Char::val(); return r; }
  270. INLINE Char  operator -  (const char a, const Char REF  b) 
  271. { Char r(a); r -= b.Char::val(); return r; }
  272. INLINE Char  operator *  (const char a, const Char REF  b) 
  273. { Char r(a); r *= b.Char::val(); return r; }
  274. INLINE Char  operator /  (const char a, const Char REF  b) 
  275. { Char r(a); r /= b.Char::val(); return r; }
  276. INLINE Char  operator %  (const char a, const Char REF  b) 
  277. { Char r(a); r %= b.Char::val(); return r; }
  278. INLINE Char  operator << (const char a, const Char REF  b) 
  279. { Char r(a); r <<= b.Char::val(); return r; }
  280. INLINE Char  operator >> (const char a, const Char REF  b) 
  281. { Char r(a); r >>= b.Char::val(); return r; }
  282. INLINE Char  operator &  (const char a, const Char REF  b) 
  283. { Char r(a); r &= b.Char::val(); return r; }
  284. INLINE Char  operator |  (const char a, const Char REF  b) 
  285. { Char r(a); r |= b.Char::val(); return r; }
  286. INLINE Char  operator ^  (const char a, const Char REF  b) 
  287. { Char r(a); r ^= b.Char::val(); return r; }
  288.  
  289. #else
  290.  
  291. INLINE Char  operator -  (const Char REF  a) return r(a)
  292. { r.negate();  }
  293. INLINE Char  operator ~  (const Char REF  a) return r(a)
  294. { r.complement();  }
  295.  
  296. INLINE Char  operator +  (const Char REF  a, const Char REF  b) return r(a)
  297. { r += b.Char::val();  }
  298. INLINE Char  operator -  (const Char REF  a, const Char REF  b) return r(a)
  299. { r -= b.Char::val();  }
  300. INLINE Char  operator *  (const Char REF  a, const Char REF  b) return r(a)
  301. { r *= b.Char::val();  }
  302. INLINE Char  operator /  (const Char REF  a, const Char REF  b) return r(a)
  303. { r /= b.Char::val();  }
  304. INLINE Char  operator %  (const Char REF  a, const Char REF  b) return r(a)
  305. { r %= b.Char::val();  }
  306. INLINE Char  operator << (const Char REF  a, const Char REF  b) return r(a)
  307. { r <<= b.Char::val();  }
  308. INLINE Char  operator >> (const Char REF  a, const Char REF  b) return r(a)
  309. { r >>= b.Char::val();  }
  310. INLINE Char  operator &  (const Char REF  a, const Char REF  b) return r(a)
  311. { r &= b.Char::val();  }
  312. INLINE Char  operator |  (const Char REF  a, const Char REF  b) return r(a)
  313. { r |= b.Char::val();  }
  314. INLINE Char  operator ^  (const Char REF  a, const Char REF  b) return r(a)
  315. { r ^= b.Char::val();  }
  316.  
  317. INLINE Char  operator +  (const Char REF  a, const char b) return r(a)
  318. { r += b;  }
  319. INLINE Char  operator -  (const Char REF  a, const char b) return r(a)
  320. { r -= b;  }
  321. INLINE Char  operator *  (const Char REF  a, const char b) return r(a)
  322. { r *= b;  }
  323. INLINE Char  operator /  (const Char REF  a, const char b) return r(a)
  324. { r /= b;  }
  325. INLINE Char  operator %  (const Char REF  a, const char b) return r(a)
  326. { r %= b;  }
  327. INLINE Char  operator << (const Char REF  a, const char b) return r(a)
  328. { r <<= b;  }
  329. INLINE Char  operator >> (const Char REF  a, const char b) return r(a)
  330. { r >>= b;  }
  331. INLINE Char  operator &  (const Char REF  a, const char b) return r(a)
  332. { r &= b;  }
  333. INLINE Char  operator |  (const Char REF  a, const char b) return r(a)
  334. { r |= b;  }
  335. INLINE Char  operator ^  (const Char REF  a, const char b) return r(a)
  336. { r ^= b;  }
  337.  
  338. INLINE Char  operator +  (const char a, const Char REF  b) return r(a)
  339. { r += b.Char::val();  }
  340. INLINE Char  operator -  (const char a, const Char REF  b) return r(a)
  341. { r -= b.Char::val();  }
  342. INLINE Char  operator *  (const char a, const Char REF  b) return r(a)
  343. { r *= b.Char::val();  }
  344. INLINE Char  operator /  (const char a, const Char REF  b) return r(a)
  345. { r /= b.Char::val();  }
  346. INLINE Char  operator %  (const char a, const Char REF  b) return r(a)
  347. { r %= b.Char::val();  }
  348. INLINE Char  operator << (const char a, const Char REF  b) return r(a)
  349. { r <<= b.Char::val();  }
  350. INLINE Char  operator >> (const char a, const Char REF  b) return r(a)
  351. { r >>= b.Char::val();  }
  352. INLINE Char  operator &  (const char a, const Char REF  b) return r(a)
  353. { r &= b.Char::val();  }
  354. INLINE Char  operator |  (const char a, const Char REF  b) return r(a)
  355. { r |= b.Char::val();  }
  356. INLINE Char  operator ^  (const char a, const Char REF  b) return r(a)
  357. { r ^= b.Char::val();  }
  358.  
  359. #endif
  360.  
  361. INLINE char  operator !  (const Char REF  a) { return !a.Char::val(); }
  362.  
  363. INLINE char  operator == (const Char REF  a, const Char REF  b) 
  364. { return a.Char::val() == b.Char::val(); }
  365. INLINE char  operator != (const Char REF  a, const Char REF  b) 
  366. { return a.Char::val() != b.Char::val(); }
  367. INLINE char  operator <  (const Char REF  a, const Char REF  b) 
  368. { return a.Char::val() <  b.Char::val(); }
  369. INLINE char  operator <= (const Char REF  a, const Char REF  b) 
  370. { return a.Char::val() <= b.Char::val(); }
  371. INLINE char  operator >  (const Char REF  a, const Char REF  b) 
  372. { return a.Char::val() >  b.Char::val(); }
  373. INLINE char  operator >= (const Char REF  a, const Char REF  b) 
  374. { return a.Char::val() >= b.Char::val(); }
  375.  
  376. INLINE char  operator == (const Char REF  a, const char b) 
  377. { return a.Char::val() == b; }
  378. INLINE char  operator != (const Char REF  a, const char b) 
  379. { return a.Char::val() != b; }
  380. INLINE char  operator <  (const Char REF  a, const char b) 
  381. { return a.Char::val() <  b; }
  382. INLINE char  operator <= (const Char REF  a, const char b) 
  383. { return a.Char::val() <= b; }
  384. INLINE char  operator >  (const Char REF  a, const char b) 
  385. { return a.Char::val() >  b; }
  386. INLINE char  operator >= (const Char REF  a, const char b) 
  387. { return a.Char::val() >= b; }
  388.  
  389. INLINE char  operator == (const char a, const Char REF  b) 
  390. { return a == b.Char::val(); }
  391. INLINE char  operator != (const char a, const Char REF  b) 
  392. { return a != b.Char::val(); }
  393. INLINE char  operator <  (const char a, const Char REF  b) 
  394. { return a <  b.Char::val(); }
  395. INLINE char  operator <= (const char a, const Char REF  b) 
  396. { return a <= b.Char::val(); }
  397. INLINE char  operator >  (const char a, const Char REF  b) 
  398. { return a >  b.Char::val(); }
  399. INLINE char  operator >= (const char a, const Char REF  b) 
  400. { return a >= b.Char::val(); }
  401.  
  402. #endif
  403. #endif
  404.